package ${package}.dao.base;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Repository;
import ${package}.common.utils.ObjectUtils;


@Repository
public class BaseDao<T> extends GeneralWriteDao{
	
//	private static final Logger logger = LoggerFactory.getLogger(BaseDao.class);
	
	private String getNameSpace(T t){
		String className = t.getClass().getSimpleName();
		return className + "Mapper";
	}
	
	private String getNameSpace(){
		String className = getClass().getSimpleName();
		return className.replace("Dao", "Mapper");
	}
	
	/**
	 * 完全匹配count
	 * @param t
	 * @return
	 */
	public int count(T t){
		return getSqlSession().selectOne(getNameSpace(t) + ".count", t);
	}
	
	/**
     * 分页查询列表，请实现Mapper中的分页查询sql，id=selectPagination
     * 参数:查询条件
     * @param t: 查询对象
     * @param pageNo 页码 从1开始
     * @param size 每页数据数
     * 返回:对象列表
     */
    public List<T> selectListPagination(T t,int pageNo,int size){
    	if (t != null) {
    		Map<String,Object> query = ObjectUtils.toHashMap(t);
    		int index = (pageNo-1)*size;
    		query.put("size", size);
    		query.put("index", index);
    		return getSqlSession().selectList(getNameSpace(t) + ".selectPagination", query);
		}else{
			return new ArrayList<>();
		}
    }
    
    /**
     * 条件查询
     * 参数:查询条件
     * 返回:对象
     */
    public T selectOne(T t){
    	if (t != null) {
    		return getSqlSession().selectOne(getNameSpace(t) + ".selectOne", t);
		}else{
			return null;
		}
    }
	
	/**
     * 根据主键删除
     * 参数:主键
     * 返回:删除个数
     */
    public int delete(T t){
    	if (t != null) {
    		return getSqlSessionW().delete(getNameSpace(t) + ".deleteByCondition", t);
		}else{
			return 0;
		}
    }    
    
    /**
     * 插入，空属性也会插入
     * 参数:pojo对象
     * 返回:插入个数  、 插入的对象主键为插入的自增长ID ，插入后id通过 t.getId() 获取
     */
    public int insert(T t){
    	if (t != null) {
    		return getSqlSessionW().insert(getNameSpace(t) + ".insert", t);
		}else{
			return 0;
		}
    }

    /**
     * 插入，空属性不会插入
     * 参数:pojo对象
     * 返回:插入个数  、 插入的对象主键为插入的自增长ID ，插入后id通过 t.getId() 获取
     */
    public int insertSelective(T t){
    	if (t != null) {
    		return getSqlSessionW().insert(getNameSpace(t) +  ".insertSelective", t);
		}
    	return 0;
    }

    
    /**
     * 条件查询
     * 参数:查询条件
     * 返回:对象列表
     */
    public List<T> selectList(T t){
    	if (t != null) {
    		return getSqlSession().selectList(getNameSpace(t) + ".selectList", t);
		}else{
			return new ArrayList<>();
		}
    }
    
    
    /**
     * 根据主键修改，空值条件不会修改成null
     * 参数:1.要修改成的对象
     * 返回:成功修改个数
     */
    public int updateSelective(T t){
    	if (t != null) {
    		return getSqlSessionW().update(getNameSpace(t) + ".updateSelective", t);
		}else{
			return 0;
		}
    }

    /**
     * 批量插入对象
     * @param list 对象列表 ，不能为null
     * @param batch 每{batch}条数据提交插入数据
     * @return int 插入的数据条数
     */
    public int batchInsert(List<T> list,int batch) throws Exception{
    	int size = list.size();
    	List<T> batchList = new ArrayList<>();
    	int effectLine = 0;
    	for (int i = 0; i < size; i++) {
			batchList.add(list.get(i));
			if(i != 0 && i%batch == 0){
				int line = getSqlSessionWBatch().insert(getNameSpace(list.get(0)) + ".batchInsert", batchList);
				effectLine = effectLine + line;
				batchList = new ArrayList<>();
			}
		}
    	if(batchList.size() > 0){
			int line = getSqlSessionWBatch().insert(getNameSpace(list.get(0)) + ".batchInsert", batchList);
			effectLine = effectLine + line;
    	}
    	return effectLine;
	}
	
	/**
	 * 字符串模糊匹配count
	 * @param t
	 * @return
	 */
	public int countLike(T t) {
		if (t != null) {
    		return getSqlSession().selectOne(getNameSpace(t) + ".countLike", t);
		}else{
			return 0;
		}
	}
	
	public List<T> selectLikeListPagination(T t, int pageNo, int limit) {
    	if (t != null) {
    		Map<String,Object> query = ObjectUtils.toHashMap(t);
    		int index = (pageNo-1)*limit;
    		query.put("size", limit);
    		query.put("index", index);
    		return getSqlSession().selectList(getNameSpace(t) + ".selectLikePagination", query);
		}else{
			return new ArrayList<>();
		}
	}

}
